/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.qp.smsmarketing.dao;

import com.qp.smsmarketing.dao.abstractdao.AbstractDAO;
import com.qp.smsmarketing.dao.abstractdao.Hib;
import com.qp.smsmarketing.entity.Mensagem;
import com.qp.smsmarketing.entity.MensagemContato;
import java.util.Date;
import java.util.List;
import javax.persistence.TemporalType;

/**
 *
 * @author waldenilson
 */
public class MensagemDAO extends AbstractDAO {

    public MensagemDAO() {
        super.entityManager = Hib.getSessionFactory();
    }

    public List buscarTodos() {
        return findAllRows("Mensagem");
    }

    public List buscarTodosAtivo() {
        return findAllRowsActive("Mensagem");
    }

    public List buscar() {
        return findAllRows("MensagemContato");
    }

    public boolean salvarObj(Object o) {
        return salvar(o);
    }

    public boolean atualizarDados(Object o) {
        return atualizar(o);
    }

    public boolean deletarMensagens(String tipoMensagem) {
        entityManager.getTransaction().begin();
        String sqlDelete = "DELETE FROM Mensagem "
                + "WHERE status_mensagem=:tipoMensagem";

        try {
            entityManager.createQuery(sqlDelete).
                    setParameter("tipoMensagem", tipoMensagem).
                    executeUpdate();
            entityManager.getTransaction().
                    commit();
            return true;

        } catch (Exception e) {
            System.out.println(e);
        }
        return false;
    }

    /**
     *
     * @param nome nome do Contato
     * @return lista de MensagemContato
     */
    public List<MensagemContato> filtrarMensagensContatoByContato(String nome) {
        String sql = "SELECT mc "
                + "FROM MensagemContato mc, Contato c, Mensagem m "
                + "WHERE m.idMensagem = mc.mensagemMensagemContato "
                + "AND mc.contatoMensagemContato = c.idContato "
                + "AND c.nomeContato LIKE:nomeContato";
        List<MensagemContato> list = entityManager.createQuery(sql).
                setParameter("nomeContato", "%" + nome + "%").
                getResultList();
        return list;

    }

    /**
     *
     * @param grupo nome do Grupo
     * @return lista de MensagemContato
     */
    public List<MensagemContato> filtrarMensagensContatoByGrupo(String grupo) {
        String sql = "SELECT mc "
                + "FROM MensagemContato mc, Contato c, Mensagem m, GrupoContato gc, Grupo g "
                + "WHERE m.idMensagem = mc.mensagemMensagemContato "
                + "AND mc.contatoMensagemContato = c.idContato "
                + "AND c.idContato = gc.contatoGrupoContato "
                + "AND gc.grupoGrupoContato = g.idGrupo "
                + "AND g.nomeGrupo LIKE:nomeGrupo";
        List<MensagemContato> list = entityManager.createQuery(sql).
                setParameter("nomeGrupo", "%" + grupo + "%").
                getResultList();
        return list;
    }

    /**
     *
     * @param celular celular do Contato
     * @return lista de MensagemContato
     */
    public List<MensagemContato> filtrarMensagensContatoByCelular(String celular) {
        String sql = "SELECT mc "
                + "FROM MensagemContato mc, Contato c, Mensagem m "
                + "WHERE m.idMensagem = mc.mensagemMensagemContato "
                + "AND mc.contatoMensagemContato = c.idContato "
                + "AND c.smsContato LIKE:celular";
        List<MensagemContato> list = entityManager.createQuery(sql).
                setParameter("celular", "%" + celular + "%").
                getResultList();
        return list;

    }

    /**
     *
     * @param data data do Contato
     * @return lista de MensagemContato
     */
    public List<MensagemContato> filtrarMensagensContatoByAniversario(String data) {
        String sql = "SELECT mc "
                + "FROM MensagemContato mc, Contato c, Mensagem m "
                + "WHERE m.idMensagem = mc.mensagemMensagemContato "
                + "AND mc.contatoMensagemContato = c.idContato "
                + "AND c.dataaniContato LIKE:data";
        List<MensagemContato> list = entityManager.createQuery(sql).
                setParameter("data", "%" + data + "%").
                getResultList();
        return list;

    }

    /**
     *
     * @param contato nome do Contato
     * @return
     */
    public List<Mensagem> filtrarMensagensByContato(String contato) {

        String sql = "SELECT m "
                + "FROM Mensagem m, MensagemContato mc, Contato c "
                + "WHERE m.idMensagem = mc.mensagemMensagemContato "
                + "AND mc.contatoMensagemContato = c.idContato "
                + "AND c.nomeContato LIKE:nome";
        List<Mensagem> list = entityManager.createQuery(sql).
                setParameter("nome", "%" + contato + "%").
                getResultList();
        return list;
    }

    /**
     *
     * @param grupo nome do Grupo
     * @return lista de Mensagens
     */
    public List<Mensagem> filtrarMensagensByGrupo(String grupo) {
        String sql = "SELECT m "
                + "FROM MensagemContato mc, Contato c, Mensagem m, GrupoContato gc, Grupo g "
                + "WHERE m.idMensagem = mc.mensagemMensagemContato "
                + "AND mc.contatoMensagemContato = c.idContato "
                + "AND c.idContato = gc.contatoGrupoContato "
                + "AND gc.grupoGrupoContato = g.idGrupo "
                + "AND g.nomeGrupo LIKE:nomeGrupo";
        List<Mensagem> list = entityManager.createQuery(sql).
                setParameter("nomeGrupo", "%" + grupo + "%").
                getResultList();
        return list;
    }

    /**
     *
     * @param celular celular do Contato
     * @return lista de Mensagens
     */
    public List<Mensagem> filtrarMensagensByCelular(String celular) {
        String sql = "SELECT m "
                + "FROM MensagemContato mc, Contato c, Mensagem m "
                + "WHERE m.idMensagem = mc.mensagemMensagemContato "
                + "AND mc.contatoMensagemContato = c.idContato "
                + "AND c.smsContato LIKE:celular";
        List<Mensagem> list = entityManager.createQuery(sql).
                setParameter("celular", "%" + celular + "%").
                getResultList();
        return list;

    }

    /**
     *
     * @param data data do Contato
     * @return lista de Mensagens
     */
    public List<Mensagem> filtrarMensagensByAniversario(String data) {
        String sql = "SELECT m "
                + "FROM MensagemContato mc, Contato c, Mensagem m "
                + "WHERE m.idMensagem = mc.mensagemMensagemContato "
                + "AND mc.contatoMensagemContato = c.idContato "
                + "AND c.dataaniContato LIKE:data";
        List<Mensagem> list = entityManager.createQuery(sql).
                setParameter("data", "%" + data + "%").
                getResultList();
        return list;

    }

    /**
     * @param contato
     * @param dataAgendada1
     * @param dataAgendada2
     * @return
     */
    public List<MensagemContato> filtrarDataByContato(String contato, Date dataAgendada1, Date dataAgendada2) {
        String sql;
        List<MensagemContato> list;
        if (contato.equals("")) {
            sql = "SELECT mc "
                    + "FROM MensagemContato mc, Mensagem m "
                    + "WHERE m.idMensagem = mc.mensagemMensagemContato "
                    + "AND mc.dataMensagemContato>=:data1 "
                    + "AND mc.dataMensagemContato<=:data2";
            list = entityManager.createQuery(sql).
                    setParameter("data1", dataAgendada1, TemporalType.DATE).
                    setParameter("data2", dataAgendada2, TemporalType.DATE).
                    getResultList();
        } else {
            sql = "SELECT mc FROM MensagemContato mc, Contato c, Mensagem m "
                    + "WHERE m.idMensagem = mc.mensagemMensagemContato "
                    + "AND mc.dataMensagemContato>=:data1 "
                    + "AND mc.dataMensagemContato<=:data2 "
                    + "AND mc.contatoMensagemContato = c.idContato "
                    + "AND c.nomeContato LIKE:nomeContato";
            list = entityManager.createQuery(sql).
                    setParameter("data1", dataAgendada1, TemporalType.DATE).
                    setParameter("data2", dataAgendada2, TemporalType.DATE).
                    setParameter("nomeContato", "%" + contato + "%").
                    getResultList();
        }

        return list;
    }

    /**
     * @param grupo
     * @param dataAgendada1
     * @param dataAgendada2
     * @return
     */
    public List<MensagemContato> filtrarDataByGrupo(String grupo, Date dataAgendada1, Date dataAgendada2) {
        String sql = "SELECT mc "
                + "FROM MensagemContato mc, Contato c, Mensagem m, GrupoContato gc, Grupo g "
                + "WHERE m.idMensagem = mc.mensagemMensagemContato "
                + "AND mc.dataMensagemContato>=:data1 "
                + "AND mc.dataMensagemContato<=:data2 "
                + "AND mc.contatoMensagemContato = c.idContato "
                + "AND c.idContato = gc.contatoGrupoContato "
                + "AND gc.grupoGrupoContato = g.idGrupo "
                + "AND g.nomeGrupo LIKE:nomeGrupo";
        List<MensagemContato> list = entityManager.createQuery(sql).
                setParameter("data1", dataAgendada1, TemporalType.DATE).
                setParameter("data2", dataAgendada2, TemporalType.DATE).
                setParameter("nomeGrupo", "%" + grupo + "%").
                getResultList();
        return list;
    }

    /**
     * @param celular
     * @param dataAgendada1
     * @param dataAgendada2
     * @return
     */
    public List<MensagemContato> filtrarDataByCelular(String celular, Date dataAgendada1, Date dataAgendada2) {
        String sql = "SELECT mc "
                + "FROM MensagemContato mc, Contato c, Mensagem m "
                + "WHERE m.idMensagem = mc.mensagemMensagemContato "
                + "AND mc.dataMensagemContato>=:data1 "
                + "AND mc.dataMensagemContato<=:data2 "
                + "AND mc.contatoMensagemContato = c.idContato "
                + "AND c.smsContato LIKE:celular";
        List<MensagemContato> list = entityManager.createQuery(sql).
                setParameter("data1", dataAgendada1, TemporalType.DATE).
                setParameter("data2", dataAgendada2, TemporalType.DATE).
                setParameter("celular", "%" + celular + "%").
                getResultList();
        return list;
    }

    /**
     * @param data
     * @param dataAgendada1
     * @param dataAgendada2
     * @return
     */
    public List<MensagemContato> filtrarDataByAniversario(String data, Date dataAgendada1, Date dataAgendada2) {
        String sql = "SELECT mc "
                + "FROM MensagemContato mc, Contato c, Mensagem m "
                + "WHERE m.idMensagem = mc.mensagemMensagemContato "
                + "AND mc.dataMensagemContato>=:data1 "
                + "AND mc.dataMensagemContato<=:data2 "
                + "AND mc.contatoMensagemContato = c.idContato "
                + "AND c.dataaniContato LIKE:data";
        List<MensagemContato> list = entityManager.createQuery(sql).
                setParameter("data1", dataAgendada1, TemporalType.DATE).
                setParameter("data2", dataAgendada2, TemporalType.DATE).
                setParameter("data", data).getResultList();
        return list;
    }

    public List<MensagemContato> getPdfList(Date date1, Date date2) {

        String sql = "select mc "
                + "from MensagemContato mc "
                + "where mc.dataMensagemContato>=:data1 "
                + "and mc.dataMensagemContato<=:data2 "
                + "and mc.statusMensagemContato = 'Enviada'";
        List<MensagemContato> list = entityManager.createQuery(sql).
                setParameter("data1", date1, TemporalType.DATE).
                setParameter("data2", date2, TemporalType.DATE).
                getResultList();
        return list;
    }
}
